package com.fingard.dsp.bank.directbank.cgb02;

import com.fingard.dsp.bank.directbank.bankInterface.IBalance;
import com.fingard.dsp.bank.reqrespobj.balance.Req7505HisBalQry;
import com.fingard.dsp.bank.reqrespobj.balance.Req7506BalQry;
import com.fingard.dsp.bank.reqrespobj.balance.RetAts7505HisBalQry;
import com.fingard.dsp.bank.reqrespobj.balance.RetAts7506BalQry;
import com.fingard.dsp.bank.reqrespobj.balance.detail.RetAtsBalDetail;
import com.fingard.xml.XmlTextReader;
import com.fingard.xml.XmlTextWriter;
/**
 * @deprecated:广发银行查询余额处理类
 * @author fujia
 * @time 20160819
 */
public class CGB02Balance extends CGB02Base implements IBalance {

	/**
	 * 单个余额查询，统一采用流处理方式
	 *1、循环调用Req7506BalQry.readRecord()读取一个请求明细，然后写入发银行的XML对象
	 *2、发银行
	 *3、循环调用XmlTextReader.read()读取一个银行返回节点，赋值返回ATS的明细对象，
	 *  然后调用RetAts7506BalQry.writeRetDetail()，写入返回ATS的明细
	*/
	public RetAts7506BalQry d_7506_BalQry(Req7506BalQry p_req7506) throws Exception{//余额查询
		//余额查询返回ATS的对象
		RetAts7506BalQry retAts = new RetAts7506BalQry(p_req7506.reqHeader);
		retAts.writeStart();//写返回ATS的统一头部信息
		try {
			//赋值通用参数
			CGB02Header bankHeader = new CGB02Header();
			bankHeader.transCode = "0001";
			bankHeader.reqSeqID = p_req7506.reqHeader.transSeqID;
			while(p_req7506.readRecord()){//不支持批量查询，逐个查询
				RetAtsBalDetail tmpRetDetail = new RetAtsBalDetail();
				tmpRetDetail.actNum = p_req7506.readedDetail.actNum;
				XmlTextWriter xmlWriter = new XmlTextWriter();//发银行报文的XML对象
				xmlWriter.autoFormat = false;
				//写入通用的头部节点
				writeCommonHeader(xmlWriter, bankHeader);
				xmlWriter.writeStartElement("Body");
				//写入账号
				xmlWriter.writeElementString("account", p_req7506.readedDetail.actNum);
				xmlWriter.writeEndElement();
				xmlWriter.writeEndDocument();
				//System.out.println("xmlWriter.toXmlString():"+xmlWriter.toXmlString());
				String[] tmpStrRet = sendToBank(xmlWriter.toXmlString());
				//如果返回tmpStrRet[0]表示返回connMsg，connMsg 为空则表示响应正常，
		  	   	
				if(tmpStrRet[0].length() == 0){
					StringBuilder tmpSbMsg = new StringBuilder();
					XmlTextReader tmpBkReader = loadBankRespXmlReader(tmpStrRet[1], tmpSbMsg);
					if(tmpBkReader != null){
						//获取银行响应代码，返回值为000或002表示处理成功，否则为处理失败
						String tmpRetCode = tmpBkReader.getFirstText("/BEDC/Message/commHead/retCode");
						if(tmpRetCode != null && (tmpRetCode.equals("000")||tmpRetCode.equals("002"))){
							if(tmpBkReader.read("/BEDC/Message/Body")){
								tmpRetDetail.respCode = "0";
								//获取币种
								tmpRetDetail.actCur = p_req7506.readedDetail.actCur;
								//获取账户
								tmpRetDetail.actNum = tmpBkReader.readedXElement.getSingleText("account");
								//获取可用余额，如果balSign为“+”表示金额为正，为“-”表示金额为负
								tmpRetDetail.availBal=(tmpBkReader.readedXElement.getSingleText("balSign").equals("+"))?
										(tmpBkReader.readedXElement.getSingleText("balance")):("-"+tmpBkReader.readedXElement.getSingleText("balance"));
								//获取冻结金额
								tmpRetDetail.frozenBal=tmpBkReader.readedXElement.getSingleText("freeze");
								//获取实际余额
								Double   currBal =Double.valueOf(tmpRetDetail.availBal+tmpRetDetail.frozenBal);
								tmpRetDetail.currBal= 	new java.text.DecimalFormat("0.00").format(currBal);  
								//获取最后交易时间
								tmpRetDetail.lastTranDate=tmpBkReader.readedXElement.getSingleText("lastDate");
							}
						}
						//处理失败respCode返回为-1
						else{
							tmpRetDetail.respCode = "-1";
						}
					}
					else{
						tmpRetDetail.respCode = "-1";
						tmpRetDetail.respInfo = tmpSbMsg.toString();
					}
				}
				else{
					tmpRetDetail.respCode = "-1";
					tmpRetDetail.respInfo = tmpStrRet[1];
				}
				retAts.writeRetDetail(tmpRetDetail, p_req7506.isBatch);
			}
		} catch (Exception e) {
			retAts.writeRespCode("-1");
			retAts.writeRespInfo(e.getMessage());
			e.printStackTrace();
		}
		retAts.writeEnd();
		return retAts;
	}

	@Override
	public RetAts7505HisBalQry d_7505_BalQry(Req7505HisBalQry p_req7505) throws Exception {
		return null;
	}

}
